/**
 * 前端表单验证工具
 * 提供各种输入验证函数，防止恶意输入
 */

/**
 * 防XSS攻击 - 转义HTML特殊字符
 */
export function escapeHtml(text) {
  if (!text) return '';
  const map = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#039;'
  };
  return text.replace(/[&<>"']/g, m => map[m]);
}

/**
 * 清理用户输入 - 移除潜在危险字符
 */
export function sanitizeInput(input) {
  if (!input) return '';
  return input
    .replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '') // 移除script标签
    .replace(/<iframe\b[^<]*(?:(?!<\/iframe>)<[^<]*)*<\/iframe>/gi, '') // 移除iframe标签
    .replace(/javascript:/gi, '') // 移除javascript:协议
    .replace(/on\w+\s*=/gi, '') // 移除事件处理器
    .trim();
}

/**
 * 验证用户名
 */
export function validateUsername(username) {
  if (!username) {
    return { valid: false, message: '用户名不能为空' };
  }
  if (username.length < 3 || username.length > 20) {
    return { valid: false, message: '用户名长度必须在3-20个字符之间' };
  if (!/^[a-zA-Z0-9_]+$/.test(username)) {
    return { valid: false, message: '用户名只能包含字母、数字和下划线' };
  }
  // 检查SQL注入关键词
  const sqlKeywords = ['select', 'insert', 'update', 'delete', 'drop', 'create', 'alter', 'exec', 'execute', 'union', 'script'];
  const lowerUsername = username.toLowerCase();
  if (sqlKeywords.some(keyword => lowerUsername.includes(keyword))) {
    return { valid: false, message: '用户名包含非法字符' };
  }
  return { valid: true, message: '' };
}

/**
 * 验证密码强度
 */
export function validatePassword(password) {
  if (!password) {
    return { valid: false, message: '密码不能为空' };
  }
  if (password.length < 8 || password.length > 32) {
    return { valid: false, message: '密码长度必须在8-32个字符之间' };
  }
  // 至少包含字母和数字
  if (!/(?=.*[a-zA-Z])(?=.*\d)/.test(password)) {
    return { valid: false, message: '密码必须包含字母和数字' };
  }
  // 检查常见弱密码
  const weakPasswords = ['12345678', 'password', '123456789', 'qwerty', 'abc123456'];
  if (weakPasswords.includes(password.toLowerCase())) {
    return { valid: false, message: '密码过于简单，请使用更复杂的密码' };
  }
  return { valid: true, message: '' };
}

/**
 * 验证邮箱
 */
export function validateEmail(email) {
  if (!email) {
    return { valid: false, message: '邮箱不能为空' };
  }
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  if (!emailRegex.test(email)) {
    return { valid: false, message: '邮箱格式不正确' };
  }
  // 防止邮箱注入
  if (email.includes('<') || email.includes('>') || email.includes('"')) {
    return { valid: false, message: '邮箱包含非法字符' };
  }
  return { valid: true, message: '' };
}

/**
 * 验证手机号
 */
export function validatePhone(phone) {
  if (!phone) {
    return { valid: false, message: '手机号不能为空' };
  }
  const phoneRegex = /^1[3-9]\d{9}$/;
  if (!phoneRegex.test(phone)) {
    return { valid: false, message: '手机号格式不正确' };
  }
  return { valid: true, message: '' };
}

/**
 * 验证文件类型
 */
export function validateFileType(file, allowedTypes = []) {
  if (!file) {
    return { valid: false, message: '文件不能为空' };
  }
  const fileName = file.name.toLowerCase();
  const fileExtension = fileName.substring(fileName.lastIndexOf('.') + 1);
  
  // 危险文件扩展名
  const dangerousExtensions = ['exe', 'bat', 'cmd', 'com', 'pif', 'scr', 'vbs', 'js', 'jar', 'sh'];
  if (dangerousExtensions.includes(fileExtension)) {
    return { valid: false, message: '不允许上传此类型文件' };
  }
  
  if (allowedTypes.length > 0 && !allowedTypes.includes(fileExtension)) {
    return { valid: false, message: `只允许上传以下类型: ${allowedTypes.join(', ')}` };
  }
  
  return { valid: true, message: '' };
}

/**
 * 验证文件大小
 */
export function validateFileSize(file, maxSizeMB = 10) {
  if (!file) {
    return { valid: false, message: '文件不能为空' };
  }
  const maxSize = maxSizeMB * 1024 * 1024;
  if (file.size > maxSize) {
    return { valid: false, message: `文件大小不能超过 ${maxSizeMB}MB` };
  }
  return { valid: true, message: '' };
}

/**
 * 验证输入长度
 */
export function validateLength(input, min = 0, max = 1000) {
  if (!input) {
    return { valid: false, message: '输入不能为空' };
  }
  if (input.length < min) {
    return { valid: false, message: `输入长度不能少于 ${min} 个字符` };
  }
  if (input.length > max) {
    return { valid: false, message: `输入长度不能超过 ${max} 个字符` };
  }
  return { valid: true, message: '' };
}

/**
 * 检测SQL注入关键词
 */
export function detectSQLInjection(input) {
  if (!input) return false;
  const sqlPatterns = [
    /(\b(SELECT|INSERT|UPDATE|DELETE|DROP|CREATE|ALTER|EXEC|EXECUTE|UNION)\b)/i,
    /(--|#|\/\*|\*\/|;)/,
    /(\bOR\b.*=.*=)/i,
    /(\bAND\b.*=.*=)/i,
    /('|"|`).*(OR|AND).*('|"|`)/i
  ];
  return sqlPatterns.some(pattern => pattern.test(input));
}

/**
 * 检测XSS攻击关键词
 */
export function detectXSS(input) {
  if (!input) return false;
  const xssPatterns = [
    /<script[^>]*>.*?<\/script>/gi,
    /<iframe[^>]*>.*?<\/iframe>/gi,
    /javascript:/gi,
    /on\w+\s*=/gi,
    /<img[^>]*src[^>]*=.*javascript:/gi,
    /<svg[^>]*onload/gi
  ];
  return xssPatterns.some(pattern => pattern.test(input));
}

